package com.tledu.pageprocessor;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

/**
 * 实现一下PageProcess的接口
 */
public class XLVRPageProcessor implements PageProcessor {
    // 发送请求的基本配置，失败重试3次， 睡眠时间1s ， 超时时间10秒
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(10 * 1000);

    @Override
    public void process(Page page) {
        // http://vr.sina.com.cn/news/hot/2022-06-27/doc-imizirav0791308.shtml
        // https://sports\.sina\.com\.cn/basketball/nba/[\w-]*/[\w-]*\.shtml
        String reg = "http://vr\\.sina\\.com\\.cn/news/hot/[\\w-]*/[\\w-]*\\.shtml";
        // 这个代表这是一个详情界面
        if (page.getUrl().regex(reg).match()) {
            // 详情界面包含内容的界面，是需要提取内容，并且交给pipiline处理的
            // 怎么处理数据,提取到标题的数据
            String title = page.getHtml().xpath("//h1/text()").get();
            // id为top_bar的div元素下的class为date的span标签下的文本
            String time = page.getHtml().xpath("//div[@class='txtdetail']/text()").get().substring(2,21);
            // id为artibody下的文本 smartContent 获取富文本内容
            String content = page.getHtml().xpath("//div[@id='fonttext']").smartContent().get();
            // 把数据设置到items里，之后，webmagic就会把数据交给pipiline
            ResultItems resultItems = page.getResultItems();
            resultItems.put("title", title);
            resultItems.put("time", time);
            resultItems.put("content", content);
        }else {
            // 其它界面代表可能列表界面，用于发现新的链接
            // 代表这个链接不会被pipiline处理
            page.setSkip(true);
        }

        // 发现新的链接
        // links() 获取所有的a标签,获取这个网站所有的满足我们详情页面正则的标签
        page.addTargetRequests(page.getHtml().links().regex(reg).all());
    }

    @Override
    public Site getSite() {
        // 网站的配置
        return site;
    }

    public static void main(String[] args) {
        Spider.create(new XLVRPageProcessor())
                .addUrl("https://vr.sina.com.cn/")
                .run();
    }
}
